package com.philips.work.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.philips.work.mapper.YwUnitMapper;
import com.philips.work.domain.YwUnit;
import com.philips.work.service.IYwUnitService;

/**
 * 机构单位Service业务层处理
 * 
 * @author philips
 * @date 2025-05-22
 */
@Service
public class YwUnitServiceImpl implements IYwUnitService 
{
    @Autowired
    private YwUnitMapper ywUnitMapper;

    /**
     * 查询机构单位
     * 
     * @param ids 机构单位主键
     * @return 机构单位
     */
    @Override
    public YwUnit selectYwUnitByIds(Long ids)
    {
        return ywUnitMapper.selectYwUnitByIds(ids);
    }

    /**
     * 查询机构单位列表
     * 
     * @param ywUnit 机构单位
     * @return 机构单位
     */
    @Override
    public List<YwUnit> selectYwUnitList(YwUnit ywUnit)
    {
        return ywUnitMapper.selectYwUnitList(ywUnit);
    }

    /**
     * 查询所有机构单位列表
     *
     * @return 机构单位列表
     */
    @Override
    public List<YwUnit> findAllUnitList() {
        // 定义返回列表
        List<YwUnit> unitList = new ArrayList<>();
        // 给列表增加根节点选项
        YwUnit rootUnit = new YwUnit();
        rootUnit.setIds(0L);
        rootUnit.setUnitName("无上级机构单位");
        rootUnit.setStatus("1");
        unitList.add(rootUnit);
        // 查询库中已有的有效机构单位
        YwUnit ywUnit = new YwUnit();
        ywUnit.setStatus("1");
        List<YwUnit> ywUnits = ywUnitMapper.selectYwUnitList(ywUnit);
        // 给列表附加查询出来的机构单位
        unitList.addAll(ywUnits);
        return unitList;
    }

    /**
     * 新增机构单位
     * 
     * @param ywUnit 机构单位
     * @return 结果
     */
    @Override
    public int insertYwUnit(YwUnit ywUnit)
    {
        if (existData(ywUnit)) {
            throw new RuntimeException("机构单位信息重复");
        }
        setAncestors(ywUnit);
        return ywUnitMapper.insertYwUnit(ywUnit);
    }

    /**
     * 修改机构单位
     * 
     * @param ywUnit 机构单位
     * @return 结果
     */
    @Override
    public int updateYwUnit(YwUnit ywUnit)
    {
        if (existData(ywUnit)) {
            throw new RuntimeException("机构单位信息重复");
        }
        setAncestors(ywUnit);
        ywUnit.setUpTime(new Date());
        return ywUnitMapper.updateYwUnit(ywUnit);
    }

    /**
     * 公用方法：验证写入的机构单位是否已经存在
     * @param ywUnit
     * @return
     */
    private boolean existData(YwUnit ywUnit) {
        YwUnit po = new YwUnit();
        po.setUnitName(ywUnit.getUnitName());
        List<YwUnit> list = ywUnitMapper.selectYwUnitList(po);
        // 默认没有非本数据记录中没有相同名称
        boolean flag = false;
        if(ywUnit.getIds()!=null){
            // 更新操作
            if(list != null && !list.isEmpty()){
                for (YwUnit po2 : list) {
                    // 非本数据记录中有相同名称
                    if (!po2.getIds().equals(ywUnit.getIds())) {
                        flag = true;
                        break;
                    }
                }
            }
        }else {
            // 新增操作
            if(list != null && !list.isEmpty()){
                flag = true;
            }
        }
        return flag;
    }

    /**
     * 设置机构单位祖级列表
     *
     * @param ywUnit 机构单位实体
     */
    private void setAncestors(YwUnit ywUnit) {
        Long parentId = ywUnit.getParentId();
        if(parentId!=null){
            if(parentId==0){
                ywUnit.setAncestors("0");
            }else{
                YwUnit parentUnit = ywUnitMapper.selectYwUnitByIds(parentId);
                ywUnit.setAncestors(parentUnit.getAncestors()+","+parentId);
            }
        }else {
            ywUnit.setAncestors("0");
        }
    }

    /**
     * 批量删除机构单位
     * 
     * @param idss 需要删除的机构单位主键
     * @return 结果
     */
    @Override
    public int deleteYwUnitByIdss(Long[] idss)
    {
        return ywUnitMapper.deleteYwUnitByIdss(idss);
    }

    /**
     * 删除机构单位信息
     * 
     * @param ids 机构单位主键
     * @return 结果
     */
    @Override
    public int deleteYwUnitByIds(Long ids)
    {
        return ywUnitMapper.deleteYwUnitByIds(ids);
    }
}
